package com.tjn.string_;

/**
 * @author 陶镓妮
 * @version 1.0
 */
public class String02 {
    public static void main(String[] args) {
        //创建String对象有两种方式
        //1.通过字面量创建
        String a="hello";
        //这个方式创建的String对象时会先看常量池中有没有hello，如果有，a就直接引用
        //如果没有，就会在常量池中创建一个hello，然后a就引用这个对象，不管如何，a都指向的是常量池中的地址

        //2.通过new创建
        String b=new String("hello");
        //这个方式创建String对象时，会先在堆中创建一个空间，里面有value属性，value属性指向常量池中的hello
        //如果没有，就创建一个hello，如果有，拒直接使用，不管如何，b指向的是堆中的空间地址

        //测试1
        String a1 = "abc";
        String b1 = "abc";
        System.out.println(a1.equals(b1));//true,equals比较的是内容
        System.out.println(a1 == b1);//true, ==比较的是地址

        //测试2
        String a2 = new String("abcd");
        String b2 = new String("abcd");
        System.out.println(a2.equals(b2));//true,equals比较的是内容
        System.out.println(a2 == b2);//false, ==比较的是地址
        System.out.println(a2.intern() == b2);//true,
        // intern()方法会检查常量池中是否有abcd，如果有，就返回常量池中的地址，如果没有，就创建一个abcd，并返回地址

        //测试3
        Person p1 = new Person();
        p1.name="hspedu";
        Person p2 = new Person();
        p2.name ="hspedu";
        System.out.println(p1.name.equals(p2.name));//比较内容: True
        System.out.println(p1.name == p2.name);//T
        System.out.println(p1.name=="hspedu");//T

        String s1 = new String("bcde");
        String s2 = new String("bcde");
        System.out.println(s1==s2); //False
    }
}
class Person{
    String name;
}